#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/12/11 23:39
# @Author  : 唐松
# @File    : csv_parameters.py
# @Software: PyCharm
import json

from util_tools.handle_data.csv_handler import read_csv_file
from util_tools.logger_util import logs


def csv_analysis_params(caseinfo):
    """csv文件参数化"""
    try:
        # 获取caseinfo的所有键
        caseinfo_keys = dict(caseinfo).keys()
        # 检查'parameters'是否在caseinfo的键中
        if 'parameters' in caseinfo_keys:
            # 遍历caseinfo中'parameters'字典的键值对
            for key, value in dict(caseinfo['parameters']).items():
                # 将caseinfo转换为JSON字符串
                caseinfo_str = json.dumps(caseinfo)
                # 将key用'-'分割成列表
                key_list = str(key).split('-')
                # 初始化csv数据格式标志为True
                length_flag = True
                # 读取CSV文件, 返回数据列表
                csv_data_list = read_csv_file(value)
                # 获取CSV数据的第一行, 作为参考行
                one_row_csv_data = csv_data_list[0]
                # 遍历CSV数据列表, 检查每一行的长度是否一致
                for csv_data in csv_data_list:
                    if len(csv_data) != len(one_row_csv_data):
                        # 如果有行长度不一致, 设置标志为False并退出循环
                        length_flag = False
                        break
                # 初始化新的caseinfo列表
                new_caseinfo = []
                # 如果CSV数据格式正确（行长度一致）
                if length_flag:
                    # 从第二行开始遍历CSV数据（跳过标题行）
                    for x in range(1, len(csv_data_list)):  # x代表行
                        # 将caseinfo字符串赋值给临时变量
                        temp_caseinfo = caseinfo_str
                        # 遍历当前行的每一列
                        for y in range(0, len(csv_data_list[x])):  # y代表列
                            # 如果标题行中的值在key_list中
                            if csv_data_list[0][y] in key_list:
                                replace_value = str(csv_data_list[x][y])
                                if replace_value.startswith("{") and replace_value.endswith("}"):
                                    # 使用eval()安全地解析结构化数据
                                    replace_value = eval(replace_value, {'__builtins__': {}})
                                    # 使用json.dumps()将字典转换为正确格式的JSON字符串
                                    replace_value = json.dumps(replace_value)
                                # 替换caseinfo字符串中的占位符为当前行对应列的值, 并确保不会破坏JSON格式
                                placeholder = '"$csv{' + csv_data_list[0][y] + '}"'  # 注意占位符周围加上了引号
                                if isinstance(replace_value, str) and not replace_value.startswith('"'):
                                    replace_value = json.dumps(replace_value)  # 确保替换值为有效的JSON字符串
                                temp_caseinfo = temp_caseinfo.replace(placeholder, replace_value)
                        # 将修改后的caseinfo字符串转换为字典并添加到列表中
                        try:
                            caseinfo_dict = json.loads(temp_caseinfo)
                            new_caseinfo.append(caseinfo_dict)
                        except json.JSONDecodeError as json_err:
                            logs.error(f"JSON解析错误:  {json_err}")
                            logs.error(f"出错的字符串:  {temp_caseinfo}")
                # 返回新的caseinfo列表
                return new_caseinfo
        else:
            # 如果'parameters'不在caseinfo的键中, 直接返回caseinfo
            return caseinfo
    except Exception as e:
        # 如果出现异常, 打印错误信息并返回空列表
        logs.error(e)
